package org.zero.controller;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.zero.model.Collection;
import org.zero.model.User;

/**
 * 请求参数绑定
 *
 * @author Zero
 */
@Controller
@RequestMapping("/params")
public class ParamsController {

    /**
     * 封装到普通类型及bean（基本类型及其包装类、String、“YYYY/MM/dd”格式的Date、BigDecimal等等）：
     * <p>
     * 当请求参数与方法参数名相同时，springmvc 框架会自动为我们封装
     *
     * @param name
     * @return
     */
    @RequestMapping("/m1")
    private String m1(@RequestParam String name, String password) {
        System.out.println("m1方法：\n用户名：" + name + "，密码：" + password);
        return "success";
    }

    /**
     * 封装到自定义Bean：
     * <p>
     * 当请求参数与Java Bean属性名对应相同时，框架会自动为我们封装
     * <p>
     * 如果被封装的bean中还有其他bean，可以通过<b>其他bean名.属性名</b>继续自动封装
     *
     * @param user
     * @return
     */
    @RequestMapping("/m2")
    private String m2(User user) {
        System.out.println("m2方法：\n用户：" + user);
        return "success";
    }

    /**
     * 封装到集合：
     * <p>
     * 封装到list：list名[下标].bean属性名
     * <p>
     * 封装到map：map名['key'].bean属性名
     *
     * @param collection
     * @return
     */
    @RequestMapping("/m3")
    private String m3(Collection collection) {
        System.out.println("m3方法：\n账户list、map：" + collection);
        return "success";
    }

    /**
     * 自定义类型转化
     * <p>
     * 例如日期类型spring框架只能自动封装“YYYY/MM/dd”的格式类型，其他不支持，如果上传的格式不匹配，就需要自定义转化
     */
    @RequestMapping("/m4")
    private String m4(User user) {
        System.out.println("m4方法：\n用户：" + user);
        return "success";
    }

    /**
     * 使用 servlet 原生 API
     * <p>
     * springmvc 框架会自动封装HttpServletRequest 和 HttpServletResponse 对象
     *
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/m5")
    private String m5(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        ServletContext servletContext = request.getServletContext();

        System.out.println("m5方法：");
        System.out.println("request:" + request);
        System.out.println("response:" + response);
        System.out.println("session:" + session);
        System.out.println("servletContext:" + servletContext);
        return "success";
    }
}
